package com.atguigu.hdfs;

import jdk.nashorn.internal.ir.CallNode;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;


/**
 * 客户端代码常用套路
 * 1.获取一个客户端对象
 * 2.执行相关的操作命令
 * 3.关闭资源
 */
public class HdfsClient {

    private FileSystem fs;
    @Before
    public void init() throws URISyntaxException, IOException, InterruptedException {
            //连接的集群和地址
            URI uri = new URI("hdfs://hadoop102:8020");
            //创建配置文件
            Configuration configuration=new Configuration();
            configuration.set("dfs.replication","3");
            //用户
            String user ="root";
            //1.获取一个对象
        fs = FileSystem.get(uri, configuration,user);
        }
        @After
        public void close() throws IOException {
            //3.关闭资源
            fs.close();
        }
    @Test
    public void testmkdir() throws URISyntaxException, IOException, InterruptedException {

        //2.进行操作 创建一个文件夹
        fs.mkdirs(new Path("/xiyou/huoguoshan33/"));

    }
    //上传
    //参数优先级   hdfs-default.xml   <   hdfs-site.xml           <    资源配置目录的配置文件   <  代码里面配置  configuration
    @Test
    public  void testPut() throws IOException {
        //参数解释   参数1：表示是否删除源文件  参数二：是否覆盖元数据    参数三：源文件路径   参数四：目标文件路径


        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String timeStartStr=simpleDateFormat.format(new Date());
        System.out.println("上传开始-----------时间"+timeStartStr);
        fs.copyFromLocalFile(false,true,new Path("D:\\Desktop\\temp\\shunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huoguoshan1/"));
        String timeEndStr=simpleDateFormat.format(new Date());
        System.out.println("上传结束-----------时间"+timeEndStr);

    }
    //下载
    @Test
    public  void testget() throws IOException {
        //参数解释   参数1：表示是否删除源文件      参数二：源文件路径   参数三：目标文件路径  参数四：是否关闭校验
        fs.copyToLocalFile(false,new Path("hdfs://hadoop102/output3"),new Path("D:\\Desktop\\temp\\"),true);
    }
    //删除
    @Test
    public  void testrm() throws IOException {
        //删除文件 参数解释   参数1：删除文件路径        参数2：是否递归删除
//        fs.delete(new Path("hdfs://hadoop102/xiyou/huoguoshan1/shunwukong.txt"),false);
        //删除空目录
//        fs.delete(new Path("hdfs://hadoop102/xiyou/huoguoshan1/"),false);
        //删除非空目录    参数2：需要递归删除
        fs.delete(new Path("hdfs://hadoop102/jinguo"),true);
    }
    //修改文件名
    @Test
    public  void testRename() throws IOException {
        //修改文件名    第一个参数是源文件位置    参数二：目标文件位置
            //这个不只可以更改名字，还可以更改文件路径9
            fs.rename(new Path("hdfs://hadoop102/xiyou/huoguoshan1/shunwukong.txt"),new Path("hdfs://hadoop102/xiyou/huoguoshan1/zhubajie.txt"));
    }
    //文件详情查看
    @Test
    public  void testSeeDetail() throws IOException {
        //便利文件夹查看所有信息
        //获取迭代器，第一个是路径，第二个是是否递归
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), true);
        while (listFiles.hasNext()) {
            LocatedFileStatus fileStatus = listFiles.next();
            System.out.println("========" + fileStatus.getPath() + "=========");
            System.out.println(fileStatus.getPermission());//权限
            System.out.println(fileStatus.getOwner());//获取拥有者
            System.out.println(fileStatus.getGroup());//获取组
            System.out.println(fileStatus.getLen());//获取长度
            System.out.println(fileStatus.getModificationTime());//获取上次修改时间
            System.out.println(fileStatus.getReplication());//副本数量
            System.out.println(fileStatus.getBlockSize());//块大小
            System.out.println(fileStatus.getPath().getName());//获取文件名
// 获取块信息
            BlockLocation[] blockLocations = fileStatus.getBlockLocations();//所有块的存储信息
            System.out.println(Arrays.toString(blockLocations));
        }

    }

}
